<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- bind 方法会创建一个新的函数，在 bind() 被调用时，这个新函数的 this 被指定为 bind() 的第一个参数，而其余参数将作为新函数的参数，供调用时使用。 -->

    <!-- 实现要点：

bind() 除了 this 外，还可传入多个参数；
bing 创建的新函数可能传入多个参数；
新函数可能被当做构造函数调用；
函数可能有返回值； -->

    <script>
      Function.prototype.myBind = function (context, ...args) {
        let self = this;
        return function F() {
          if (this instanceof F) {
            // 当做构造函数来使用了
            return new self(...agrs, ...arguments);
          } else {
            return self.apply(context, args.concat(...arguments));
          }
        };
      };
    </script>
  </body>
</html>
